perm filename MCPR[DOC,TOB] blob sn#232243 filedate 1976-08-15 generic text, type T, neo UTF8

;;; ARRAYS FOR LAYING OUT POISSON DISTRIBUTIONS

(ARRAY P1L1+ FLONUM 80.) 

(ARRAY P0L1- FLONUM 80.) 

(ARRAY P0L0+ FLONUM 80.) 

(ARRAY P1L01- FLONUM 80.) 

(ARRAY P0L00- FLONUM 80.) 

;;; VARIABLES DEFINING LENGTHS OF THE DISTRIBUTIONS
;;; EPSILON IS THE INHIBITION FACTOR

(DECLARE (SPECIAL NP1L1+ NP0L1- NP0L0+ NP1L01- NP0L00- EPSILON)
	 (FIXNUM NP1L1+ NP1L1- NP0L0+ NP1L01- NP0L00-)
	 (FIXNUM L+ L-)
	 (FLONUM F EPSILON)) 

(DECLARE (FIXNUM (ENTER-POISSON-DISTRIBUTION NOTYPE FLONUM) I)
	 (FLONUM VALUE X)) 

;;; SET UP THE DISTRIBUTIONS

(DEFUN ENTER-POISSON-DISTRIBUTION (ARRAYPOINTER MU) 
       (PROG (VALUE X I) 
	     (SETQ VALUE (EXP (-$ MU)) I 0. X 0.0)
	LOOP (STORE (ARRAYCALL FLONUM ARRAYPOINTER I) VALUE)
	     (COND ((AND (> X MU) (< VALUE 1.0E-5)) (RETURN I))
		   (T (SETQ I (1+ I) X (1+$ X))
		      (SETQ VALUE (*$ VALUE (//$ MU X)))
		      (GO LOOP)))))

;;; can do same computations using the more expensive but more
;;; accurate binomial distribution

(DECLARE (FIXNUM N R (ENTER-BINOMIAL-DISTRIBUTION NOTYPE FLONUM FIXNUM))
         (FLONUM P VALUE FACTOR))

(DEFUN ENTER-BINOMIAL-DISTRIBUTION (ARRAYPOINTER P N) 
       (PROG (VALUE FACTOR) 
	     (STORE (ARRAYCALL FLONUM ARRAYPOINTER N) (EXPT P N))
	     (SETQ VALUE (EXPT (-$ 1.0 P) N))
	     (SETQ FACTOR (//$ P (-$ 1.0 P)))
             (STORE (ARRAYCALL FLONUM ARRAYPOINTER 0.) VALUE)
             (DO I 1 (1+ I) (= I N)
                 (SETQ VALUE (*$ VALUE FACTOR (//$ (FLOAT (- N I -1)) (FLOAT I))))
                 (STORE (ARRAYCALL FLONUM ARRAYPOINTER I) VALUE))
             (RETURN (1+ N))))

;;; given L1+, L1- and F, P1, P0 and THETA, derive new P1* and P0*

(DECLARE (SPECIAL L1+ L1- L0+ L01- L00- F P1 P0)
	 (FIXNUM L1+ L1- THETA)
	 (FLONUM F P1 P0 (P1* FIXNUM) (P0* FIXNUM))) 

(SETQ L1+ 13. L1- 12. F (//$ 1.0 7.0) EPSILON 1.0)

(P '(SET L1+ L1- F AND EPSILON DEFAULTS ARE) L1+ L1- F 'AND EPSILON) 

(DEFUN SET-UP-POISSON-DISTRIBUTIONS (PROB1 PROB0) 
       (PROG NIL 
	     ;;; set current probabilities
	     (SETQ P1 PROB1 P0 PROB0)
	     ;;; assumptions about the operator allow these assignments
	     (SETQ L0+ L1+ 
		   L01- (FIX (+$ 0.5 (*$ F (FLOAT L1-)))) 
		   L00- (- L1- L01-))
	     (SETQ NP1L1+
		   (ENTER-POISSON-DISTRIBUTION (GET 'P1L1+
						    'ARRAY)
					       (*$ PROB1
						   (FLOAT L1+))))
	     (SETQ NP0L1-
		   (ENTER-POISSON-DISTRIBUTION (GET 'P0L1-
						    'ARRAY)
					       (*$ PROB0
						   (FLOAT L1-))))
	     (SETQ NP0L0+
		   (ENTER-POISSON-DISTRIBUTION (GET 'P0L0+
						    'ARRAY)
					       (*$ PROB0
						   (FLOAT L0+))))
	     (SETQ NP1L01-
		   (ENTER-POISSON-DISTRIBUTION (GET 'P1L01-
						    'ARRAY)
					       (*$ PROB1
						   (FLOAT L01-))))
	     (SETQ NP0L00-
		   (ENTER-POISSON-DISTRIBUTION (GET 'P0L00-
						    'ARRAY)
					       (*$ PROB0
						   (FLOAT L00-))))
	     (RETURN '(POISSON DISTRIBUTIONS SET UP))))

(DEFUN SET-UP-BINOMIAL-DISTRIBUTIONS (PROB1 PROB0) 
       (PROG NIL 
	     ;;; set current probabilities
	     (SETQ P1 PROB1 P0 PROB0)
	     ;;; assumptions about the operator allow these assignments
	     (SETQ L0+ L1+ 
		   L01- (FIX (+$ 0.5 (*$ F (FLOAT L1-)))) 
		   L00- (- L1- L01-))
	     (SETQ NP1L1+
		   (ENTER-BINOMIAL-DISTRIBUTION (GET 'P1L1+
						    'ARRAY)
					        PROB1
						L1+))
	     (SETQ NP0L1-
		   (ENTER-BINOMIAL-DISTRIBUTION (GET 'P0L1-
						    'ARRAY)
					        PROB0
						L1-))
	     (SETQ NP0L0+
		   (ENTER-BINOMIAL-DISTRIBUTION (GET 'P0L0+
						    'ARRAY)
					        PROB0
						L0+))
	     (SETQ NP1L01-
		   (ENTER-BINOMIAL-DISTRIBUTION (GET 'P1L01-
						    'ARRAY)
					        PROB1
						L01-))
	     (SETQ NP0L00-
		   (ENTER-BINOMIAL-DISTRIBUTION (GET 'P0L00-
						    'ARRAY)
					        PROB0
						L00-))
	     (RETURN '(BINOMIAL DISTRIBUTIONS SET UP)))) 

(DECLARE (FLONUM (PROB-OF-X2 FIXNUM FIXNUM FIXNUM) VALUE THISTERM)
	 (FIXNUM THETA X1 X2 X2LIMIT M1 M2 M3)) 

(DEFUN P1* (THETA) 
       (PROG (M1 M2 X2LIMIT VALUE THISTERM) 
	     ;;; pick up M1 and M2 from the specials
	     (SETQ M1 (1- NP1L1+) M2 (1- NP0L1-))
	     (SETQ VALUE 0.0)
	     (DO X1
		 THETA
		 (1+ X1)
		 (> X1 M1)
		 (SETQ THISTERM 0.0 X2LIMIT (MIN (FIX (//$ (FLOAT (- X1 THETA))
                                                           EPSILON))
                                                  M2))
		 (DO X2
		     0.
		     (1+ X2)
		     (> X2 X2LIMIT)
		     (SETQ THISTERM (+$ THISTERM (P0L1- X2))))
		 (SETQ VALUE (+$ VALUE (*$ (P1L1+ X1) THISTERM))))
	     (RETURN VALUE))) 

(DEFUN P0* (THETA) 
       (PROG (M1 X2LIMIT M2 M3 VALUE THISTERM) 
	     ;;; pick up M1 from the specials
	     (SETQ M1 (1- NP0L0+) M2 (1- NP1L01-) M3 (1- NP0L00-))
	     (SETQ VALUE 0.0)
	     (DO X1
		 THETA
		 (1+ X1)
		 (> X1 M1)
		 (SETQ THISTERM 0.0 X2LIMIT (FIX (//$ (FLOAT (- X1 THETA))
                                                      EPSILON)))
		 (DO X2
		     0.
		     (1+ X2)
		     (> X2 X2LIMIT)
		     (SETQ THISTERM (+$ THISTERM
					(PROB-OF-X2 X2 M2 M3))))
		 (SETQ VALUE (+$ VALUE (*$ (P1L1+ X1) THISTERM))))
	     (RETURN VALUE))) 

(DECLARE (FIXNUM X2 M2 M3 Y1L Y1U Y1) (FLONUM VALUE)) 

(DEFUN PROB-OF-X2 (X2 M2 M3) 
       (PROG (VALUE Y1L Y1U) 
	     (SETQ VALUE 0.0)
	     (SETQ Y1L (MAX 0. (- X2 M3)) Y1U (MIN (1- X2) M2))
	     (DO Y1
		 Y1L
		 (1+ Y1)
		 (> Y1 Y1U)
		 (SETQ VALUE (+$ VALUE
				 (*$ (P1L01- Y1) (P0L00- (- X2 Y1))))))
	     (RETURN VALUE))) 

;;; POISSON DISTRIBUTION

(DECLARE (FIXNUM N (FACT FIXNUM))) 

(DEFUN FACT (N) (COND ((= N 0.) 1.) (T (* N (FACT (1- N)))))) 

(DECLARE (FLONUM (POISSON FIXNUM FLONUM))) 

(DEFUN POISSON (N MU) 
       (COND ((= N 0.) (EXP (-$ MU)))
	     (T (*$ (POISSON (1- N) MU) (//$ MU (FLOAT N)))))) 

(DECLARE (FLONUM A B ANS (BINOM FIXNUM FIXNUM))) 

(DEFUN BINOM (N R) 
       (PROG (B ANS) 
	     (SETQ ANS 1.0)
	     (SETQ B (FLOAT N))
	     (DO A
		 (FLOAT R)
		 (1-$ A)
		 (= A 0.0)
		 (SETQ ANS (//$ (*$ ANS B) A))
		 (SETQ B (1-$ B)))
	     (RETURN ANS))) 

(DECLARE (FLONUM X (BINOMIAL FLONUM FIXNUM FIXNUM)) (FIXNUM N R)) 

(DEFUN BINOMIAL (X R N) 
       (*$ (BINOM N R) (EXPT X R) (EXPT (-$ 1.0 X) (- N R)))) 
βββ